package mms.farina.thecell.services;



import mms.farina.thecell.Sender2;
import mms.farina.thecell.activities.MainActivity;
import mms.farina.thecell.messages.CustomMessage;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Binder;
import android.os.Bundle;
import android.os.ConditionVariable;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;

/**Servizio per l'invio delle info dell'utente nella rete*/
public class GeoInfoService extends Service {
	
	private static int INFO_POLL_FREQUENCY=10; /**Frequenza con cui vengono inviate anche le informazioni aggiuntive*/
	public static int NO_COORDINATE=800; /**Valore utilizzato per definire valori di coordinate non validi*/
	private ConditionVariable mCond;
	public static Thread geoThread; /**Thread che effettua l'invio dei messaggi di informazione e geolocalizzazione*/
	LocationManager locationManager; /**Gestisce il recupero delle informazioni di geolocalizzazione del dispositivo*/
	LocationListener locationListener;
	double latitude=NO_COORDINATE;
	double longitude=NO_COORDINATE;
	int count=0;
	public static Handler activateGeoLocation; /**Handler per attivare/disattivare la geolocalizzazione*/
	public static boolean active_geoloc=false;


	/**Thread che effettua l'invio dei messaggi di informazione e geolocalizzazione*/
	private Runnable mTask = new Runnable() {
        public void run() {
        	Looper.prepare();
        	Sender2 sender2=new Sender2();

        	while(true){
        		
        		
        		CustomMessage message=null;
        	
        		
        		if(count==INFO_POLL_FREQUENCY && latitude!=NO_COORDINATE && latitude!=NO_COORDINATE){
        			
        			message=new CustomMessage(CustomMessage.MESSAGE_TYPE_GEOINFO, ReceiveService.NAME, latitude, longitude);
        			count=0;
        		}
        		else message=new CustomMessage(CustomMessage.MESSAGE_TYPE_GEOINFOPLUS, ReceiveService.NAME, latitude, longitude, ReceiveService.IP_CLIENT, ReceiveService.PORT_CLIENT);
        		
        		sender2.sendMessage(message, false);
        		
        		count++;
        		
        		if (mCond.block(ReceiveService.GEO_TIME)) {sender2.closeSender();
                      break;}
        		if(locationManager.isProviderEnabled(LOCATION_SERVICE)) setupLocationManager();
        	} 
        	
        }
	};
	
	/**Gestisce il recupero delle informazioni di geolocalizzazione del dispositivo*/
	public void setupLocationManager(){
		
		locationManager = (LocationManager) GeoInfoService.this.getSystemService(Context.LOCATION_SERVICE);
		if(locationManager==null)return;
		    	
    	locationListener = new LocationListener() {
    	    public void onLocationChanged(Location location) {
    	    	
    	    	latitude=location.getLatitude();
    	    	longitude=location.getLongitude();
    	    	ReceiveService.geoInfo.put(ReceiveService.NAME, new double[]{latitude, longitude});
    	    	Message m=new Message();
    	    	m.obj=latitude+" "+longitude;
    			if(ReceiveService.verboseNotification)MainActivity.recvHandler.sendMessage(m);
    	      
    	    }
    	    public void onStatusChanged(String provider, int status, Bundle extras) {}

    	    public void onProviderEnabled(String provider) {}

    	    public void onProviderDisabled(String provider) {}
    	  };
    	  locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    	  if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
	}
	
	
	
	@Override
    public void onCreate() {
		setupLocationManager();
		
		geoThread = new Thread(mTask, "GeoInfoService");
        mCond = new ConditionVariable();
        mCond.close();
        
        geoThread.start();
        
        /**Handler per attivare/disattivare la geolocalizzazione*/
        activateGeoLocation = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				MainActivity.geoserviceActive=true;
				setupLocationManager();

			}
		};
    }
	
	public class LocalBinder extends Binder {
		GeoInfoService getService() {
            return GeoInfoService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new LocalBinder();
    }
    
    @Override
    public void onDestroy() {
    	mCond.open();
    }


}
